/*

本库的功能是完美实现dll替换, 自动且无缝切换新旧动态库, 热更新功能, 它的前身借鉴于 "hot-lib-reloader", 但在它的
基础上却掉了影响性能的各种锁, 和状态, 增加了 "加载前", "卸载前" 等事件;

特性如下
1. 开箱即用, 如 "dlopen2" 无缝衔接, 直接调用dll中的方法, 无需其它转换
2. 零成本抽象, 不使用任何读写锁, 也没有用原子锁, 追求极致的性能
3. 可与业务代码深度融合, 有加载前, 卸载前等事件可以跟踪处理业务代码

*/
use dlopen2::wrapper::WrapperApi;
use hotload::types::Hotload;

type AsyncType<T> = std::pin::Pin<Box<dyn std::future::Future<Output = T>>>;

// 生成以下结构体代码
hotload::gen_rust_no_mangle!((MyApi, "../call_lib/src/lib.rs"));

// #[derive(WrapperApi)]
// struct MyApi {
//     test_print: fn(msg: String),
//     init_data: fn(msg: String),
//     stop_runtime: fn(),
// }

fn main() {
    // 初始化日志
    std::env::set_var("RUST_LOG", "debug");
    env_logger::init();
    log::info!("env_logger starting up");

    let dll: Hotload<MyApi> = Hotload::new("../call_lib/target/debug/call_lib.dll");
    dll.init_load(|_, _| {}).unwrap();

    let mut count = 0;
    loop {
        count += 1;
        dll.test_print(format!("msg{count}"));
    }

    println!("--------the end ----------------");
}
